using SheLife.Domain.Entities;

namespace SheLife.Domain.Interfaces.Repositories
{
    public interface IClothingRepository : IRepository<Clothing>
    {
        Task<IEnumerable<Clothing>> GetByUserIdAsync(Guid userId);
        Task<IEnumerable<Clothing>> GetByCategoryAsync(string category);
        Task<IEnumerable<Clothing>> GetByColorAsync(string color);
        Task<IEnumerable<Clothing>> GetByBrandAsync(string brand);
        Task<IEnumerable<Clothing>> GetBySeasonAsync(string season);
        Task<IEnumerable<Clothing>> SearchByNameAsync(string keyword);
    }

    public interface IOutfitRepository : IRepository<Outfit>
    {
        Task<IEnumerable<Outfit>> GetByUserIdAsync(Guid userId);
        Task<IEnumerable<Outfit>> GetByCategoryAsync(string category);
        Task<IEnumerable<Outfit>> GetBySeasonAsync(string season);
        Task<IEnumerable<Outfit>> GetByOccasionAsync(string occasion);
        Task<IEnumerable<Outfit>> SearchByNameAsync(string keyword);
    }

    public interface IOutfitRecordRepository : IRepository<OutfitRecord>
    {
        Task<IEnumerable<OutfitRecord>> GetByUserIdAndDateRangeAsync(Guid userId, DateTime startDate, DateTime endDate);
        Task<IEnumerable<OutfitRecord>> GetByOutfitIdAsync(Guid outfitId);
        Task<OutfitRecord> GetLatestByUserIdAsync(Guid userId);
    }

    public interface IOutfitTemplateRepository : IRepository<OutfitTemplate>
    {
        Task<IEnumerable<OutfitTemplate>> GetByCategoryAsync(string category);
        Task<IEnumerable<OutfitTemplate>> GetBySeasonAsync(string season);
        Task<IEnumerable<OutfitTemplate>> GetByOccasionAsync(string occasion);
        Task<IEnumerable<OutfitTemplate>> SearchByNameAsync(string keyword);
    }

    public interface IOutfitTemplateItemRepository : IRepository<OutfitTemplateItem>
    {
        Task<IEnumerable<OutfitTemplateItem>> GetByTemplateIdAsync(Guid templateId);
        Task<IEnumerable<OutfitTemplateItem>> GetByCategoryAsync(string category);
    }

    public interface IUserOutfitTemplateRepository : IRepository<UserOutfitTemplate>
    {
        Task<IEnumerable<UserOutfitTemplate>> GetByUserIdAsync(Guid userId);
        Task<IEnumerable<UserOutfitTemplate>> GetByTemplateIdAsync(Guid templateId);
        Task<bool> IsUserTemplateExistsAsync(Guid userId, Guid templateId);
    }

    public interface IOutfitSuggestionRepository : IRepository<OutfitSuggestion>
    {
        Task<IEnumerable<OutfitSuggestion>> GetByUserIdAsync(Guid userId);
        Task<IEnumerable<OutfitSuggestion>> GetByUserIdAndDateAsync(Guid userId, DateTime date);
        Task<IEnumerable<OutfitSuggestion>> GetByOccasionAsync(string occasion);
        Task<IEnumerable<OutfitSuggestion>> GetByWeatherAsync(string weather);
    }
}